package com.tool.cn.use;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.tool.cn.util.StringUtil;

/**
 * 配置文件获取类
 * 
 * @author wangzh 2016年9月18日 上午9:12:32
 */
public final class PropUse {
	
	private final Logger log = LoggerFactory.getLogger(this.getClass());
	
	private Properties per=new Properties();
	/**
	 * 全路径读取配置文件
	 * @param path 绝对路径文件位置
	 * @return
	 */
	public   boolean loadFile(String path){
		return LoadFile(path, "utf-8");
	}
	
	/**
	 * 全路径读取配置文件
	 * @param path 绝对路径文件路径
	 * @param encode 编码
	 * @return
	 */
	public boolean LoadFile(String path,String encoded) {
		FileInputStream inputStream=null;
		try {
			inputStream = new FileInputStream(path);  
			if(StringUtil.isEmpty(encoded)) {
				per.load(inputStream);
				inputStream.close();
			}else {
				InputStreamReader input = new InputStreamReader(inputStream, encoded);
				per.load(input);
				input.close();
			}
			
		} catch(Exception e) {
			log.error("Deal FIle:"+path+" Error",e);
			return false;
		}finally{
			if(inputStream!=null){
				try {
					inputStream.close();
				} catch (IOException e) {
					log.error("close input stream failure:"+e);
				}
			}
		}
		return true;
	}
	
	/**
	 * 读取配置文件string数据
	 * @param key 对象名
	 * @return
	 */
	public String getStringValue(String key) {
		return getStringValue(key, "");
	}
	
	/**
	 * 读取配置文件string数据
	 * @param key 对象名
	 * @return
	 */
	public String getStringValue(String key,String defaultValue) {
		if(per.containsKey(key.trim())) {
			String value= per.getProperty(key.trim()).trim();
			if(StringUtil.isEmpty(value)) {
				return defaultValue;
			}
			return value;
		}else {
			log.error("No Found Type:{} Set Default Value",key,defaultValue);
			return defaultValue;
		}
		
	}
	
	/**
	 * 读取配置文件Int数据
	 * @param key 对象名
	 * @param state 提取结果
	 * @return
	 */
	public int getIntValue(String key,boolean state) {
		return getIntValue(key, -1, state);
	}
	
	/**
	 * 读取配置文件Int数据
	 * @param key 对象名
	 * @param defaultValue 提取结果
	 * @param state 提取结果
	 * @return
	 */
	public int getIntValue(String key,int defaultValue,boolean state) {
		if(per.containsKey(key.trim())) {
			String value=per.getProperty(key.trim()).trim();
			if(StringUtil.isNumber(value)) {
				state=true;
				return Integer.parseInt(value);
			}
			state=false;
			log.error("Get Key:{} Value:{} To Int Number Error,Set Default Value:{}",key,value,defaultValue);
			return defaultValue;
		}else {
			log.error("No Found Type:{} Set Default Value",key,defaultValue);
			state=false;
			return defaultValue;
		}
		
	}
	
	/**
	 * 读取配置文件Long数据
	 * @param key 对象名
	 * @param state 提取结果
	 * @return
	 */
	public long getLongValue(String key,boolean state) {
		return getLongValue(key, -1L, state);
	}
	
	/**
	 * 读取配置文件Int数据
	 * @param key 对象名
	 * @param defaultValue 提取结果
	 * @param state 提取结果
	 * @return
	 */
	public long getLongValue(String key,long defaultValue,boolean state) {
		if(per.containsKey(key.trim())) {
			String value=per.getProperty(key.trim()).trim();
			if(StringUtil.isNumber(value)) {
				state=true;
				return Long.parseLong(value);
			}
			state=false;
			log.error("Get Key:{} Value:{} To Long Number Error,Set Default Value:{}",key,value,defaultValue);
			return defaultValue;
		}else {
			log.error("No Found Type:{} Set Default Value",key,defaultValue);
			state=false;
			return defaultValue;
		}
		
	}
	

	/**
	 * 根据文件名加载src下配置文件
	 */
	public Properties getProperties(String configName) {
		return getProperties(configName, "utf-8");
	}

	/**
	 * 根据文件名加载src下配置文件
	 * 
	 */
	public Properties getProperties(String configName, String encoded) {
		Properties properties=new Properties();
		InputStream inputStream =null;
		try {
			inputStream = this.getClass().getClassLoader().getResourceAsStream(configName);
			if(StringUtil.isEmpty(encoded)){
				properties.load(inputStream);
			}else{
				InputStreamReader input = new InputStreamReader(inputStream, encoded);
				properties.load(input);
				input.close();
			}
			
		} catch (Exception e) {
			log.warn(e.toString(), e);
		}finally{
			if(inputStream!=null) {
				try {
					inputStream.close();
				} catch (IOException e) {
					log.error(e.toString(),e);
				}
			}
		}
		
		return properties;
	}
}
